package com.gkzf.ai.module.crm.util.extracted;

import com.gkzf.ai.module.crm.util.YearlyRecord;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
   <table>
     <tr>
       <td></td>
       <td>1</td>
       <td>2</td>
       <td>3</td>
       <td>4</td>
       <td>5</td>
       <td>6</td>
       <td>7</td>
       <td>8</td>
       <td>9</td>
       <td>10</td>
       <td>11</td>
       <td>12</td>
     </tr>
     <tr>
       <td>2024</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
       <td>N<br>0</td>
     </tr>
     </table>
     解析方法
    */
@Slf4j
public class ParseRepaymentTableData implements Extracted{
    @Override
    public Map<String, YearlyRecord> extractedData(String html, Set<String> SWAP_TRIGGER_CHARS) {
        Document doc = Jsoup.parseBodyFragment(html);

        // 用于存储数据的 Map：年份 -> YearlyRecord 对象
        Map<String, YearlyRecord> yearDataMap = new HashMap<>();

        // 选择所有表格行
        Elements rows = doc.select("tr");

        // 遍历行，跳过第一个表头行（索引 0）
        for (int i = 1; i < rows.size(); i++) {
            Element row = rows.get(i);
            Elements tds = row.select("td");

            // 确保行有足够的列（至少一年份列和一个数据列）
            if (tds.size() < 2) {
                continue; // 跳过看起来不像数据行的行
            }

            // 第一个 td 是年份
            String year = tds.first().text().trim();

            // 为该年份创建一个新的 YearlyRecord
            YearlyRecord record = new YearlyRecord(year);

            // 遍历数据 td（从第二个 td 开始，即索引 1）
            for (int j = 1; j < tds.size(); j++) {
                Element td = tds.get(j);
                // 获取 td 的内部 HTML 内容以保留 <br> 标签
                String tdHtmlContent = td.html();

                // 根据 <br> 分割内容（不区分大小写，可选的空格/斜杠）
                // 限制参数 -1 确保包含末尾的空字符串，例如 "abc<br>" 分割后是 ["abc", ""]
                String[] parts = tdHtmlContent.split("<br\\s*/?>", -1);

                String valueBeforeBr = ""; // <br> 前的值，默认为空字符串
                String valueAfterBr = "";  // <br> 后的值，默认为空字符串

                if (parts.length > 0) {
                    // 清理第一部分：移除前导/尾随空白字符和任何剩余的换行符
                    valueBeforeBr = parts[0].trim().replaceAll("[\r\n]", "");
                }
                if (parts.length > 1) {
                    // 清理第二部分：同样的清理操作
                    valueAfterBr = parts[1].trim().replaceAll("[\r\n]", "");
                }
                // 如果 parts.length > 2，后续的部分将根据只需要两个列表的要求被忽略。

                // 将清理后的值添加到记录的列表中
                record.addDataPoint(valueBeforeBr, valueAfterBr);
            }

            // --- 添加检查和互换逻辑 ---
            boolean shouldSwap = false;
            // 遍历 record.list1 中的每个值
            for (String value : record.getMonthList()) {
                try {
                    // 尝试将值解析为整数
                    int num = Integer.parseInt(value);
                    // 如果解析成功并且值大于 7
                    if (num > 7) {
                        shouldSwap = true; // 设置互换标志
                        break;             // 找到一个大于7的值就足够了，停止检查
                    }
                } catch (NumberFormatException e) {
                    // 如果值不是有效的数字，parseInt 会抛异常。
                    // 非数字的值不能大于 7，所以捕获异常后不做任何处理，继续检查下一个值。
                }
            }
            // --- 添加基于 list2 内容的检查和互换逻辑 ---
            // 遍历 record.list2 (它存储了原始的 Value3) 中的每个值
            for (String value : record.getMoneyList()) {
                // 检查值是否是我们定义的触发字符集合中的一个
                if (SWAP_TRIGGER_CHARS.contains(value)) {
                    shouldSwap = true; // 设置互换标志
                    break;             // 找到一个匹配的字符就足够了，停止检查
                }
            }

            // 如果需要互换
            if (shouldSwap) {
                log.info("年份 " + year + " 的数据需要互换 List1 和 List2 (List1中包含 > 7 的值)");
                // 互换 list1 和 list2 的内容
                List<String> temp = record.getMonthList();
                record.setMonthList(record.getMoneyList());
                record.setMoneyList(temp);
            }
            // --- 互换逻辑结束 ---
            if (!StringUtils.isNotBlank(year)){
                Element oneRow = rows.get(0);
                Element firstTd = oneRow.selectFirst("td");
                if (firstTd != null) {
                    year = firstTd.text().trim();
                }
            }
            // 将记录存储在 Map 中
            yearDataMap.put(year, record);
        }
        return yearDataMap;
    }
}
